﻿Type.registerNamespace("MoniMisi2");

MoniMisi2.Formulario = function(element) {
    MoniMisi2.Formulario.initializeBase(this, [element]);
    this.ID = null;
    this.DelCrear = Function.createDelegate(this, this.Crear);
    this.DelErrado = Function.createDelegate(this, this.Errado);
    this.DelAceptar = Function.createDelegate(this, this.Aceptar);
    this.DelAceptado = Function.createDelegate(this, this.Aceptado);
    this.DelCancelar = Function.createDelegate(this, this.Cancelar);
    this.DelMosueDown = Function.createDelegate(this, this.Dragar);
    this.DelMouseMove = Function.createDelegate(this, this.MoverDrag);
    this.DelMouseUp = Function.createDelegate(this, this.Dropear);
    this.DelSelect = Function.createDelegate(this, function(evento) { return false });
    this.PosRel = { x: null, y: null }
    this.PosModal = { x: null, y: null }
    this.Controles = { Al: [], Ba: [], Mo: [], Co: [], Ac: [], Ca: [] };
    this.Modal = null;
    this.Fondo = null;
    this.Foco = { Al: null, Ba: null, Mo: null, Co: null };
    this.OpActual = null;
    this.Registro = null;
    this.CreadoArgs = function(pRegistro) { this.Registro = pRegistro };
    this.CanceladoArgs = function(pRegistro, pOperacion) { this.Registro = pRegistro; this.Operacion = pOperacion };
    this.AceptadoArgs = function(pRegistro, pOperacion) { this.Registro = pRegistro; this.Operacion = pOperacion };
    this.AceptandoArgs = function(pRegistro, pOperacion) { this.Registro = pRegistro; this.Operacion = pOperacion };
    this.MostradoArgs = function(pRegistro, pOperacion) { this.Registro = pRegistro; this.Operacion = pOperacion };
    this.ValidandoArgs = function(pValores, pControles, pOperacion) { this.Valores = pValores; this.Controles = pControles; this.Operacion = pOperacion; this.Erroneo = false; this.Mensajes = new Array() };
    this.Funciones = new MoniMisi2.Funciones();
    this.SpanErr = null;

}

MoniMisi2.Formulario.prototype = {
    initialize: function() {
        MoniMisi2.Formulario.callBaseMethod(this, 'initialize');
        Sys.Application.add_load(this.DelCrear);
    },
    dispose: function() {
    },

    Crear: function() {
        var Todos = document.getElementsByTagName("body")[0].getElementsByTagName("*")
        this.get_element().control.add_Errado(this.DelErrado);
        for (var n = 0; n < Todos.length; n += 1) {
            if (Todos[n].id.indexOf(this.ID + "_") == 0) {
                var Nombres = Todos[n].id.split("_");
                if (Nombres.length > 1) {
                    var hay = false
                    if (Nombres[1].indexOf("Al") != -1) { this.Controles.Al.push(Todos[n]); hay = true }
                    if (Nombres[1].indexOf("Ba") != -1) { this.Controles.Ba.push(Todos[n]); hay = true }
                    if (Nombres[1].indexOf("Mo") != -1) { this.Controles.Mo.push(Todos[n]); hay = true }
                    if (Nombres[1].indexOf("Co") != -1) { this.Controles.Co.push(Todos[n]); hay = true }
                    if (!hay && Nombres[1].indexOf("Mdl") == -1) {
                        this.Controles.Al.push(Todos[n])
                        this.Controles.Ba.push(Todos[n])
                        this.Controles.Mo.push(Todos[n])
                        this.Controles.Co.push(Todos[n])
                    }
                    if (Nombres[1].indexOf("Ac") != -1) {
                        this.Controles.Ac.push(Todos[n])
                        $addHandler(Todos[n], "click", this.DelAceptar);
                    }
                    if (Nombres[1].indexOf("Ca") != -1) {
                        this.Controles.Ca.push(Todos[n])
                        $addHandler(Todos[n], "click", this.DelCancelar);
                    }
                    if (Nombres[1].indexOf("Mdl") != -1) {
                        this.Fondo = document.createElement("div")
                        this.Fondo.style.display = "none";
                        this.Fondo.style.position = "absolute"
                        this.Fondo.style.backgroundColor = "transparent"
                        this.Fondo.style.top = "0px"
                        this.Fondo.style.left = "0px"
                        document.getElementsByTagName("body")[0].appendChild(this.Fondo);
                        this.Modal = Todos[n];
                        this.Modal.style.display = "none";
                        this.Modal.style.position = "absolute"
                        this.Modal.style.zIndex = 1000
                    }
                    if (Nombres[1].indexOf("FA") != -1) {
                        this.Foco.Al = Todos[n]
                    }
                    if (Nombres[1].indexOf("FB") != -1) {
                        this.Foco.Ba = Todos[n]
                    }
                    if (Nombres[1].indexOf("FC") != -1) {
                        this.Foco.Co = Todos[n]
                    }
                    if (Nombres[1].indexOf("FM") != -1) {
                        this.Foco.Mo = Todos[n]
                    }
                    if (Nombres[1].indexOf("DR") != -1) {
                        $addHandler(Todos[n], "mousedown", this.DelMosueDown);
                    }
                    if (Nombres[1].indexOf("Err") != -1) {
                        this.SpanErr = Todos[n];
                        this.SpanErr.appendChild(document.createElement("UL"));
                    }


                }
            }
        }
        var e = new this.CreadoArgs(this.Registro);
        var h = this.get_events().getHandler('Creado');
        if (h) { h(this, e) }

    },
    Dragar: function(e) {
        $addHandler(document, "mousemove", this.DelMouseMove);
        $addHandler(document, "mouseup", this.DelMouseUp);
        $addHandler(document, "selectstart", this.DelSelect);
        this.PosRel = this.Funciones.CoordenadasMouseEnControl(e, this.Fondo);
    },
    MoverDrag: function(e) {
        var PosMouse = this.Funciones.CoordenadasMouseEnControl(e, this.Fondo);
        this.Modal.style.top = (this.Modal.offsetTop - (this.PosRel.y - PosMouse.y)) + "px";
        this.Modal.style.left = (this.Modal.offsetLeft - (this.PosRel.x - PosMouse.x)) + "px";
        this.PosRel = PosMouse
        e.preventDefault();

    },
    Dropear: function(e) {
        $removeHandler(document, "mousemove", this.DelMouseMove);
        $removeHandler(document, "mouseup", this.DelMouseUp);
        $removeHandler(document, "selectstart", this.DelSelect);
        this.PosModal = { x: this.Modal.offsetLeft, y: this.Modal.offsetTop }
    },

    Mostrar: function(pOperacion) {
        if (pOperacion != "Al" && this.get_element().control.Registro == undefined) { return };
        this.LimpiarErrores();
        this.OpActual = pOperacion;
        this.Registro = (pOperacion == "Al") ? this.get_element().control.RegistroBlanco(true) : this.get_element().control.Clonar();
        this.MostrarModal();
        this.OcultarTodo();
        for (var n = 0; n < this.Controles[pOperacion].length; n += 1) {
            this.Controles[pOperacion][n].style.display = ""
            var Sec = this.Controles[pOperacion][n].id.split("_")
            if (Sec.length > 2) {
                this.Asignar(Sec.slice(2).join("_"), this.Controles[pOperacion][n], this.Registro);
            }
        }
        this.MostrarModal();
        if (this.Foco[pOperacion] != null) {
            if (this.Foco[pOperacion].style.display != "none") {
                this.Foco[pOperacion].focus();
            }
        }
        var e = new this.MostradoArgs(this.Registro, this.OpActual);
        var h = this.get_events().getHandler('Mostrado');
        if (h) { h(this, e) }
    },
    MostrarModal: function() {
        if (this.Modal != null) {
            this.Fondo.style.display = ""
            this.Fondo.style.height = document.documentElement.scrollHeight + "px";
            this.Fondo.style.width = document.documentElement.scrollWidth + "px";
            this.Modal.style.display = ""
            if (this.PosModal.x == null) {
                var y = (document.documentElement.scrollHeight - this.Modal.offsetHeight) / 3
                var x = (document.documentElement.scrollWidth - this.Modal.offsetWidth) / 2;
                this.Modal.style.top = y < 0 ? 0 : y + "px";
                this.Modal.style.left = x < 0 ? 0 : x + "px";
            } else {
                this.Modal.style.top = this.PosModal.y + "px";
                this.Modal.style.left = this.PosModal.x + "px";
            }

        };
    },
    OcultarModal: function() {
        if (this.Modal != null) {
            this.Modal.style.display = "none"
            this.Fondo.style.display = "none"
        };
    },

    OcultarTodo: function() {
        for (var n = 0; n <= 6; n += 2) {
            var Op = "AlBaMoCo".substr(n, 2);
            for (var s = 0; s < this.Controles[Op].length; s += 1) {
                this.Controles[Op][s].style.display = "none";
                var Contr = this.Controles[Op][s].control
                if (Contr != undefined) {
                    this.Funciones.HacerValido(Contr);
                }
            }
        }
    },

    Aceptar: function() {
        var Datos = this.get_element().control;
        var e = new this.AceptandoArgs(this.Registro, this.OpActual);
        var h = this.get_events().getHandler('Aceptando');
        if (h) { h(this, e) };
        switch (this.OpActual) {
            case "Al":
                this.Leer()
                if (this.Validar()) {
                    this.AceptarDisabled(true)
                    Datos.add_Agregado(this.DelAceptado);
                    Datos.Agregar({ RegistroActual: this.Registro });
                }
                break;
            case "Mo":
                this.Leer()
                if (this.Validar()) {
                    this.AceptarDisabled(true)
                    Datos.add_Modificado(this.DelAceptado);
                    Datos.Modificar({ RegistroActual: this.Registro });
                }
                break;
            case "Ba":
                if (this.Validar()) {
                    this.AceptarDisabled(true)
                    Datos.add_Eliminado(this.DelAceptado);
                    Datos.Eliminar();
                }
                break;
            case "Co":
                this.OcultarModal();
                break;
        }
    },
    AceptarDisabled: function(pDisabled) {
        for (var n = 0; n < this.Controles.Ac.length; n++) {
            this.Controles.Ac[n].disabled = pDisabled;
        }
    },

    Validar: function() {
        var Valido = true
        var ControlArgs = new Array();
        for (var n = 0; n < this.Controles[this.OpActual].length; n += 1) {
            var Identi = this.Controles[this.OpActual][n].id.split("_")
            if (Identi[2] != undefined) {
                ControlArgs[Identi[2]] = this.Controles[this.OpActual][n];
            }
            if (this.Controles[this.OpActual][n].control != undefined) {
                if (this.Controles[this.OpActual][n].control["Validar"] != undefined) {
                    var ValidarEn = this.Controles[this.OpActual][n].getAttribute("ValidarEn");
                    if (ValidarEn == undefined || ValidarEn == "Formulario" || ValidarEn == "Ambos") {
                        this.Controles[this.OpActual][n].control.Validar()
                    }
                    if (!this.Controles[this.OpActual][n].control.EsValido) {
                        Valido = false;
                    }
                }
            }
        }

        var e = new this.ValidandoArgs(this.Registro, ControlArgs, this.OpActual);
        var h = this.get_events().getHandler('Validando');
        if (h) {
            h(this, e)
            this.LimpiarErrores()
            if (e.Erroneo) {
                this.MostrarErrores(e.Mensajes);
            }
        }
        return (!e.Erroneo && Valido);
    },
    LimpiarErrores: function() {
        if (this.SpanErr != null) {
            var Lista = this.SpanErr.children[0];
            while (Lista.firstChild) {
                Lista.removeChild(Lista.firstChild)
            };
        }
    },
    MostrarErrores: function(pMensajes) {

        var Datos = this.get_element().control;
        if (!Datos.OData) {
            if (this.SpanErr != null) {
                var Lista = this.SpanErr.children[0];
                for (var n = 0; n < pMensajes.length; n += 1) {
                    var NuevoLi = document.createElement("LI")
                    NuevoLi.innerHTML = pMensajes[n];
                    Lista.appendChild(NuevoLi)
                }
            } else {
                var MensajeError = ""
                for (var n = 0; n < pMensajes.length; n += 1) {
                    MensajeError += pMensajes[n] + String.fromCharCode(13) + String.fromCharCode(10);

                }
                alert(MensajeError);
            }
        } else {
            var Lista = null
            var MensajeError = ""
            if (this.SpanErr != null) { Lista = this.SpanErr.children[0] }

            for (var n = 0; n < pMensajes.length; n += 1) {
                var informado = false;
                for (var c = 0; c < this.Controles[this.OpActual].length; c += 1) {
                    var Identi = this.Controles[this.OpActual][c].id.split("_")
                    if (Identi[2] == pMensajes[n].Codigo) {
                        if (this.Controles[this.OpActual][c].control.spanError != undefined) {
                            this.Funciones.InvalidarControl(this.Controles[this.OpActual][c].control, pMensajes[n].Mensaje);
                        }
                        informado = true
                    }
                }
                if (!informado) {
                    if (Lista != null) {
                        var NuevoLi = document.createElement("LI")
                        NuevoLi.innerHTML = pMensajes[n].Mensaje;
                        Lista.appendChild(NuevoLi)
                    } else {
                        MensajeError += pMensajes[n].Mensaje + String.fromCharCode(13) + String.fromCharCode(10);
                    }
                }
            }
            if (MensajeError != "") { alert(MensajeError) }
        }
    },

    Aceptado: function(sender, e) {
        var Datos = this.get_element().control; ;
        //        switch (this.OpActual) {
        //            case "Al":
        //                Datos.remove_Agregado(this.DelAceptado);
        //                break;
        //            case "Mo":
        //                Datos.remove_Modificado(this.DelAceptado);
        //                break;
        //            case "Ba":
        //                Datos.remove_Eliminado(this.DelAceptado);
        //                break;
        //        };
        this.RemoverEventos(sender, e);
        this.AceptarDisabled(false)
        var e = new this.AceptadoArgs(Datos.Clonar(), this.OpActual);
        var h = this.get_events().getHandler('Aceptado');
        if (h) { h(this, e) }
        this.OcultarModal();
    },

    Cancelar: function() {
        var e = new this.CanceladoArgs(this.Registro, this.OpActual);
        var h = this.get_events().getHandler('Cancelado');
        if (h) { h(this, e) }
        this.OcultarModal();
    },
    Errado: function(sender, e) {
        this.RemoverEventos(sender, e);
        this.AceptarDisabled(false)
        var h = this.get_events().getHandler('Errado');
        if (h) { h(this, e) }
        this.LimpiarErrores()
        this.MostrarErrores(e);
    },
    RemoverEventos: function(sender, e) {
        var Datos = this.get_element().control; ;
        switch (this.OpActual) {
            case "Al":
                Datos.remove_Agregado(this.DelAceptado);
                break;
            case "Mo":
                Datos.remove_Modificado(this.DelAceptado);
                break;
            case "Ba":
                Datos.remove_Eliminado(this.DelAceptado);
                break;
        };
    },
    Asignar: function(pNombre, pControl, pRegistro) {
        var Nombre = pNombre.split("__");
        var Valor = pRegistro == null ? null : pRegistro[Nombre[0]];
        if (Valor != null) {
            for (var n = 1; n < Nombre.length; n += 1) {
                Valor = Valor[Nombre[n]]
            };
        }
        //        var Valor = pRegistro == null ? null : pRegistro[Nombre];
        if (pControl.control != undefined) {
            pControl.control.set_value(Valor);
        } else {
            if ($find(pControl.id) != undefined) {
                $find(pControl.id).set_value(Valor);
            } else {
                switch (pControl.tagName) {
                    case 'IMG':
                        pControl.src = Valor ? Valor : 'none';
                        break;
                    case 'A':
                        pControl.href = Valor ? Valor : '';
                        break;
                    case 'INPUT':
                        switch (pControl.type) {
                            case 'radio': case 'checkbox':
                                pControl.checked = Valor;
                                break;
                            case 'submit':
                                pControl.src = Valor
                                break;
                            case 'text':
                                pControl.value = Valor;
                                break;
                            case 'password':
                                pControl.value = Valor;
                                break;
                            default:
                                break;
                        }
                        break;
                    default:
                        if (pControl.value != undefined) {
                            pControl.value = Valor;
                        } else {
                            if (Valor == null) { Valor = "" }
                            if (typeof (Valor) == "object") { if (Valor.constructor.__typeName == "Date") { Valor = Valor.toLocaleDateString() } }
                            pControl.innerHTML = Valor;
                        }

                        break;
                }
            }
        }
    },

    Leer: function() {
        for (var c = 0; c < this.Controles[this.OpActual].length; c += 1) {
            var Valor = null;
            var pControl = this.Controles[this.OpActual][c];
            var Sec = pControl.id.split("_")
            if (Sec.length > 2) {
                var Prop = Sec.slice(2).join("_");
                if (pControl.control != undefined) {
                    Valor = pControl.control.get_value();
                } else {
                    if ($find(pControl.id) != undefined) {
                        Valor = $find(pControl.id).get_value();
                    } else {
                        switch (pControl.tagName) {
                            case 'INPUT':
                                switch (pControl.type) {
                                    case 'radio': case 'checkbox':
                                        Valor = pControl.checked
                                        break;
                                    case 'submit':
                                        Valor = pControl.src
                                        break;
                                    case 'text':
                                        Valor = pControl.value
                                        break;
                                    case 'password':
                                        Valor = pControl.value
                                        break;
                                    default:
                                        break;
                                }
                                break;
                            default:
                                if (pControl.value != undefined) {
                                    Valor = pControl.value;
                                } else {
                                    Valor = pControl.innerHTML;
                                }
                                break;
                        }
                    }
                }
                this.Registro[Prop] = Valor
            }
        }
        return this.Registro
    },
    get_ID: function() {
        return this.ID;
    },

    set_ID: function(value) {
        if (this.ID !== value) {
            this.ID = value
            this.raisePropertyChanged('ID');
        }
    },

    add_Mostrado: function(handler) {
        this.get_events().addHandler('Mostrado', handler);
    },
    remove_Mostrado: function(handler) {
        this.get_events().removeHandler('Mostrado', handler);
    },

    add_Aceptado: function(handler) {
        this.get_events().addHandler('Aceptado', handler);
    },
    remove_Aceptado: function(handler) {
        this.get_events().removeHandler('Aceptado', handler);
    },
    add_Aceptando: function(handler) {
        this.get_events().addHandler('Aceptando', handler);
    },
    remove_Aceptando: function(handler) {
        this.get_events().removeHandler('Aceptando', handler);
    },
    add_Validando: function(handler) {
        this.get_events().addHandler('Validando', handler);
    },
    remove_Validando: function(handler) {
        this.get_events().removeHandler('Validando', handler);
    },

    add_Cancelado: function(handler) {
        this.get_events().addHandler('Cancelado', handler);
    },
    remove_Cancelado: function(handler) {
        this.get_events().removeHandler('Cancelado', handler);
    },
    add_Creado: function(handler) {
        this.get_events().addHandler('Creado', handler);
    },
    remove_Creado: function(handler) {
        this.get_events().removeHandler('Creado', handler);
    },
    add_Errado: function(handler) {
        this.get_events().addHandler('Errado', handler);
    },
    remove_Errado: function(handler) {
        this.get_events().removeHandler('Errado', handler);
    }


}

MoniMisi2.Formulario.registerClass('MoniMisi2.Formulario', Sys.UI.Behavior);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();